/*
 * @Author: szx
 * @Date: 2021-11-27 11:26:38
 * @LastEditTime: 2021-11-27 12:01:42
 * @Description:
 * @FilePath: \leetcode\500-599\519\519.js
 */
/**
 * @param {number} m
 * @param {number} n
 */
var Solution = function (m, n) {
    this.m = m;
    this.n = n;
    this.total = m * n;
    this.map = new Map();
};

/**
 * @return {number[]}
 */
// 总的思想就是，抽取total-1的幸运儿，如果没有翻转过，那么返回的就是这个幸运儿，并且把这个幸运儿映射到total-1，就代表用过了
// 那么[total-1,m*n]的映射其实都是被用过了；如果抽到的幸运儿是翻转过的，那么就是之前的映射过的total-1
Solution.prototype.flip = function () {
    // 就随机生成一个数字，抽选一个幸运儿，x是下标
    const x = Math.floor(Math.random() * this.total);
    this.total--;
    // 查找位置 x 对应的映射，如果为没被翻转过，那么就是下标本身
    // 如果被翻转过，那么就是x对应的之前的total下标
    const idx = this.map.get(x) || x;
    // 将位置 x 对应的映射设置为位置 total 对应的映射
    // 如果没被翻转过，那么把当前x的值映射到
    this.map.set(x, this.map.get(this.total) || this.total);
    // 没被翻转过，返回的就是下标的矩阵值
    return [Math.floor(idx / this.n), idx % this.n];
};

/**
 * @return {void}
 */
Solution.prototype.reset = function () {
    this.total = this.m * this.n;
    this.map.clear();
};

var obj = new Solution(3, 4);

console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.flip());
console.log(obj.map);
obj.reset();
